// 封装axios请求
import axios from "axios"
import qs from "qs";
import Cookies from "js-cookie";
import Nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import store from "../store";
import router from "@/router";


//我们的项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来匹配我们的默认的接口url前缀。axios.defaults.baseURL可以设置axios的默认请求地址
//3. 环境的切换
let baseURL = ''

// let host = "http://192.168.1.188:8080"
let host = ''
let action = ''
if (process.env.NODE_ENV == 'development') {//development---开发环境  //   baseURL = 'http://81.71.14.65:8080/m.api';//外网 // baseURL = 'http://192.168.1.188:8080/m.api';//内网
  baseURL = '/m.api';//内网
  action = host+'/upload/admin'
} else {
  // baseURL = "http://81.71.14.65:8080/m.api"//----生产环境
  baseURL = "/m.api"//----生产环境
  // action = host+'/upload/admin'
  action =host+'/upload/admin'
}
// 创建一个实例
const api = axios.create({
  baseURL, // 所有请求的公共地址部分
  timeout: 3000 // 请求超时时间 这里的意思是当请求时间超过5秒还未取得结果时 提示用户请求超时
})
// 创建一个实例
const apiup = axios.create({
  action, // 所有请求的公共地址部分
  timeout: 3000 // 请求超时时间 这里的意思是当请求时间超过5秒还未取得结果时 提示用户请求超时
})
// request拦截------请求拦截器 // 请求相关处理 请求拦截 在请求拦截中可以补充请求相关的配置
// interceptors --- axios的拦截器对象
api.interceptors.request.use(config => { // config 请求的所有信息
  Nprogress.start()  //开启进度条命令

  config.headers['AdminToken'] = Cookies.get('token')//请求头---这个是把请求所需要的token在main.js这里全局配置好
  return config // 将配置完成的config对象返回出去 如果不返回 请求就不会进行
}, err => {
  console.log(err, "我现在是请求拦截器"); // 请求发生错误时的相关处理 抛出错误
  Promise.reject(err)
})
let _mt = ["_mt=edit","_mt=create","_mt=update","_mt=delete"]
// response拦截------响应拦截器
api.interceptors.response.use(async function (res) {// 我们一般在这里处理，请求成功后的错误状态码 例如状态码是500，404，403
  Nprogress.done()  //关闭进度条
  // 无痛刷新
  let path = router.currentRoute.value.fullpath;//当前路由对象
  if (10006 === res.data.errno) {
    let _mtdata = res.config.data || ""
   let index =_mt.findIndex(item=>_mtdata.includes(item))
    if (-1 == index) {
      router.replace({ path: "login", query: { back: path } })
    }
    let { username, password } = store.state.login.uAndp//把vuex里面的username和password传过来
    let newLogin = {//登录的接口数据
      _gp: "admin",
      _mt: "login", username, password
    }
    const { errno, data, errmsg } = await post(baseURL,newLogin) //用awiat重新请求-----await与async一起使用
  
    if (200 == errno) {
      Cookies.set("token", data,60*30)//把重新请求回来的token重新保存到cookies里面
    } else {
      router.replace({ path: "login", query: { back: path } })//登录后返回原来的路由
      return
    }
    // 重新发送上一次请求
    return interceptors.request(res.config)
  } 
  return Promise.resolve(res)
}, function (err) {
  // 服务器响应发生错误时的处理
  Promise.reject(err)
})
function get(params) {
  return api.get('', { params })
}
function post(data, params) {

  return api.post('', qs.stringify(data), { params })
}
function upload(url, data) {//给上传图片的请求接口路径
  return apiup.post(url, data)

}
// 暴露出去
export { get, post, upload,host,action }